循环不变代码外提(LICM):一种编译器优化,把在循环中每次迭代结果都不会改变的计算,从循环体中“搬”到循环外(通常搬到循环的前置块 preheader),以减少重复计算、提升性能。
(在某些情况下也可能做“下沉”到循环后,但最常见是外提/提升 hoisting。)
/ˈluːp ɪnˈvɛəriənt koʊd ˈmoʊʃən/
Loop-invariant code motion can speed up programs by removing redundant work inside loops.
循环不变代码外提可以通过移除循环内部的重复计算来加速程序。
After proving the expression is loop-invariant and has no side effects, the optimizer hoists it to the loop preheader.
在证明该表达式对循环不变且没有副作用之后,优化器会把它外提到循环的前置块。
该术语由三部分组成:loop(循环)+ invariant(不变的)+ code motion(代码移动)。字面意思就是“把循环中不变的代码移动到别处”。它源自编译原理与优化领域对“把计算从热点路径移走”的经典思想:只要计算结果在循环内不会变化,并且移动不会改变程序可观察行为(例如副作用、异常、内存别名影响等),就可以安全外提以减少执行次数。